/* 
 * File:   Literal.h
 * Author: Gab'z
 *
 * Created on 27 mai 2012, 21:35
 */

#ifndef LITERAL_H
#define	LITERAL_H

#include "../UndoableRedoableCommand.h"

namespace calculator {

    /**
     * Classe mère des constantes. En vue d'étendre l'application aux variables
     * pour les commandes utilisateurs.
     */
    class Literal : public UndoableRedoableCommand {
    public:

        /**
         * Un Literal est toujours exécutable.
         * @return std::string("").
         */
        virtual std::string isExecutable() const;
        virtual void execute() const throw (CommandException) = 0;
        virtual std::string toString() const = 0;
        virtual Literal* clone() const = 0;

    protected:

        /**
         * Constructeur de Literal.
         * On ne passe pas de nom en argument, la méthode toString utilise 
         * la valeur du Literal.
         */
        Literal();

        /**
         * Destructeur de Literal.
         */
        virtual ~Literal();
    private:
        /**
         * Crée un Memento vide.
         * Rien à sauvegarder, utilisation d'un EmptyMemento.
         * @return un EmptyMemento ne contenant que la ligne de saisie 
         * et une copie de la commande/littéral.
         */
        virtual const Memento* createMemento() const throw (CommandException);

        /**
         * Restaure la pile dans son état précédent.
         * Se contente de dépiler l'élément ajouté (un Literal).
         * @param memento un EmptyMemento.
         */
        virtual void restoreFromMemento(const Memento* memento) const throw (MementoException);
    };

}
#endif	/* LITERAL_H */

